// 请添加导入、导出或空的 "export {}" 语句来使它成为模块
export { }

/**
 * 泛型 - 练习题
 *
 * 需求预期：
 *  根据参数一传入对象，书写参数二时有代码提示
 *  getProp({ name: 'jack' , age: 18 }, 'name')
*/

/**
 * 1. 先写js 函数
 * 2. 参数一是传入的对象，类型则是根据传入的对象定义，所以是不确定的，泛型占位
 * 3. 参数二需要提示的值是根据参数一来的，两者有关联，所以也是动态不确定的，泛型占位
 * 4. 参数二泛型占位后，因为他的值就是 参数一的对象键值，所以参数二的泛型要约束为 参数一的键名
 * 5. 泛型约束：<T extends **>，获取对象的键名称：keyof 类型接口或类型别名
 * 6. 简写：<T extends keyof **>
 */

// 1. 先写js 函数
// const getProp = (obj, key) => {
//     return obj[key]
// }

// 2. 参数一泛型占位
// const getProp = <T>(obj: T, key) => {
//     return obj[key]
// }

// 3. 参数二泛型占位
// const getProp = <T, K>(obj: T, key: K) => {
//     return obj[key]
// }

// 4. 参数二范围太大，做泛型约束
// const getProp = <T, K extends T>(obj: T, key: K) => {
//     return obj[key]
// }

// 5. 具体约束为 参数一的键名
// const getProp = <T, K extends keyof T>(obj: T, key: K) => {
//     return obj[key]
// }

const getProp = <T, K extends keyof T>(obj: T, key: K) => {
    return obj[key]
}
getProp({ name: 'jack', age: 18 }, 'age')
























